package com.zl.registration.service;

import com.zl.registration.module.prefix.KeyPrefix;

/**
 * @author zoulei
 * @date 2021/11/23 11:55
 */
public interface RedisService {

    /**
     * 获取
     *
     * @param key key
     * @param prefix key前缀
     * @return value
     */
    String get(KeyPrefix prefix, String key);

    /**
     * 添加
     *
     * @param prefix key前缀
     * @param key key
     * @param val value
     */
    void set(KeyPrefix prefix, String key, String val);

    /**
     * 判断 key 是否存在
     *
     * @param keyPrefix key前缀
     * @param key       key
     * @return 响应
     */
    boolean exists(KeyPrefix keyPrefix, String key);

    /**
     * 自增
     *
     * @param keyPrefix key前缀
     * @param key       key
     * @return 当前值
     */
    long incr(KeyPrefix keyPrefix, String key);

    /**
     * 自减
     *
     * @param keyPrefix key前缀
     * @param key       key
     * @return 当前值
     */
    long decr(KeyPrefix keyPrefix, String key);

    /**
     * 删除
     *
     * @param prefix key前缀
     * @param key    key
     * @return 响应
     */
    boolean delete(KeyPrefix prefix, String key);

    /**
     * 获取锁
     *
     * @param lockKey     锁
     * @param uniqueValue 能够唯一标识请求的值，以此保证锁的加解锁是同一个客户端
     * @param expireTime  过期时间, 单位：milliseconds
     * @return 响应
     */
    boolean lock(String lockKey, String uniqueValue, int expireTime);

    /**
     * 解锁（使用Lua脚本保证解锁的原子性）
     *
     * @param lockKey     锁
     * @param uniqueValue 能够唯一标识请求的值，以此保证锁的加解锁是同一个客户端
     * @return 响应
     */
    boolean unlock(String lockKey, String uniqueValue);
}
